//通过互斥锁维护多线程抢票的安全性
#include <iostream>
#include <pthread.h>
#include <cstdio>
#include <unistd.h>
#include <mutex>
#include <string>

//count叫做线程的局部存储
//__thread int count=0;//这个变量在他所在的线程内是全局可访问的，但是不能被其他进程看到
//保证了线程的数据独立性


//全局变量tickets代表票数
int tickets=1000;
//定义全局的锁
pthread_mutex_t lock=PTHREAD_MUTEX_INITIALIZER;
void* routine(void* args)
{
    //std::string name=static_cast<char*>(args);
    char* id=(char*)args;
    while(1)
    {
        pthread_mutex_lock(&lock);
        if(tickets>0)
        {
            usleep(1000);
            printf("%s抢到ticket票:%d\n",id,tickets);
            tickets--;
            pthread_mutex_unlock(&lock);
        }
        else
        {
            pthread_mutex_unlock(&lock);
            break;
        }
    }
    return nullptr;
}
int main()
{
    //创建多线程
    pthread_t t1,t2,t3,t4;
    pthread_create(&t1,nullptr,routine,(void*)"threa-1");
    pthread_create(&t2,nullptr,routine,(void*)"threa-2");
    pthread_create(&t3,nullptr,routine,(void*)"threa-3");
    pthread_create(&t4,nullptr,routine,(void*)"threa-4");

    //等待线程退出，不关心结果
    pthread_join(t1,nullptr);
    pthread_join(t2,nullptr);
    pthread_join(t3,nullptr);
    pthread_join(t4,nullptr);

    return 0;
}